package pe.com.sysaut.seguridad.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.google.gson.Gson;

import pe.com.sysaut.seguridad.bean.UsuarioBean;
import pe.com.sysaut.seguridad.domain.Tcargo;
import pe.com.sysaut.seguridad.domain.Tperfil;
import pe.com.sysaut.seguridad.service.SeguridadService;
import pe.com.sysaut.seguridad.vmodel.GestionarUsuarioView;
import pe.com.sysaut.seguridad.vmodel.PersonaView;
import pe.com.sysaut.util.Configuracion;
import pe.com.sysaut.util.ConstanteSYSAUT;
import pe.com.sysaut.util.Constantes;
import pe.com.sysaut.util.Mappings;
import pe.com.sysaut.util.SelectSysaut;
import pe.com.sysaut.util.TituloSeguridad;
import pe.com.sysaut.util.Util;
import pe.com.sysaut.util.VistasJsp;


@Controller
public class SeguridadController {

	private static final Logger logger = Logger.getLogger(SeguridadController.class);
	HttpSession session;
	
	@Autowired
	SeguridadService seguridadService;
	
	@RequestMapping(value=Mappings.MAPPING_SEGURIDAD_INICIAR_SESSION,method=RequestMethod.POST)
	public ModelAndView iniciarSesion(HttpServletRequest request, HttpServletResponse response){
		logger.info(this.getClass().getName()+"iniciarSesion()[");
		String url_response;
		
		session=(HttpSession) request.getSession();
		
		session.setAttribute("basePath",  Configuracion.getInstance().getProperty("pathResources.dojo"));
		session.setAttribute("vista", Configuracion.getInstance().getProperty("pathResources.vista"));
		
		String usuario=request.getParameter("username");
		String contrasenia=request.getParameter("password");
		
		UsuarioBean usuarioBean=seguridadService.getUsuarioLogin(usuario, contrasenia);
		
		
		if (usuarioBean!=null){
			session.setAttribute(pe.com.sysaut.util.Constantes.SESION_USUARIO,usuarioBean);
			url_response=VistasJsp.JSP_MAIN;
		}else{
			url_response=VistasJsp.JSP_ERROR;
		}
		
		logger.info(this.getClass().getName()+"iniciarSesion()]");
		return new ModelAndView(url_response);
	}
	
	@RequestMapping(value=Mappings.MAPPING_MENU_PRINCIPAL, method=RequestMethod.GET)  
	public void cargarMenu(HttpServletRequest request, HttpServletResponse response){
		HttpSession session = (HttpSession) request.getSession();
		UsuarioBean usuarioLogin = (UsuarioBean) session.getAttribute(pe.com.sysaut.util.Constantes.SESION_USUARIO);
		
		String json = seguridadService.obtenerMenu(usuarioLogin);
		Util.printJson(response, json);
	}
	
	
	/************************************** Seguridad***************************************/
	@RequestMapping(value=Mappings.MAPPING_SEGURIDAD_IR_GESTIONAR_USUARIO,method=RequestMethod.GET)
	public ModelAndView ir_mantenerUsuario(){
		GestionarUsuarioView gestionarUsuario=new GestionarUsuarioView();
		gestionarUsuario.setTitulo(TituloSeguridad.TITULO_SEGURIDAD_GESTIONAR_USUARIOS);
		
		return new ModelAndView(VistasJsp.JSP_SEGURIDAD_GESTIONAR_USUARIOS,"gestionarUsuarioView",gestionarUsuario);
	}
	/************************************** Seguridad***************************************/
	
	
	
	
	
	/**************************************[GESTIONAR USUARIOS]***********************************************/
	@RequestMapping(value=Mappings.MAPPING_GESTION_USUARIO_CONSULTA_FILTROS,method=RequestMethod.POST)
	public void consultaUsuariosPorFiltros(HttpServletRequest request, HttpServletResponse response){
		
		
		String nombre=request.getParameter("nombre").trim();
		String usuario=request.getParameter("usuario").trim();
		
		Util.printJson(response, seguridadService.obtenerUsuariosPorFiltros(nombre, usuario));
	}
	
	@RequestMapping(value=Mappings.MAPPING_GESTION_USUARIO_REGISTRAR_USUARIO,method=RequestMethod.POST)
	public void registrarUsuario(HttpServletRequest request, HttpServletResponse response){
		
		UsuarioBean usuarioBean=new UsuarioBean();

		usuarioBean.setNomUsuario(request.getParameter("nomUsuario"));
		usuarioBean.setNumDni(request.getParameter("codPersona"));
		usuarioBean.setIdCargo(request.getParameter("codCargo"));
		usuarioBean.setIdPerfil(request.getParameter("codPerfil"));
		usuarioBean.setContrasenia(request.getParameter("contrasenia"));
		
		
		
		Util.printJson(response, seguridadService.registrarUsuario(usuarioBean));
	}
	/**************************************[GESTIONAR USUARIOS]***********************************************/
	
	
	/**************************************[REUTILIZABLES]***********************************************/
	@RequestMapping(value=Mappings.MAPPING_GESTION_USUARIO_GENERAR_USUARIO,method=RequestMethod.POST)
	public void generarusuario(HttpServletRequest request, HttpServletResponse response){
		String dni =request.getParameter("dni");
		
		Util.printJson(response, seguridadService.generarUsuario(dni));
	}
	
	@RequestMapping(value=Mappings.MAPPING_REGISTRAR_PERSONA,method=RequestMethod.POST)
	public void registrarPersona(HttpServletRequest request, HttpServletResponse response){

		String dni=request.getParameter("dni");
		String nombre=request.getParameter("nombre");
		String apePaterno=request.getParameter("apePaterno");
		String apeMaterno=request.getParameter("apeMaterno");
		String fechaNacimiento=request.getParameter("fechaNacimiento");
		String correo=request.getParameter("correo");
		String telefono=request.getParameter("numeroTelefono");
		
		PersonaView personaView=new PersonaView();
		personaView.setDni(dni);
		personaView.setNombre(nombre);
		personaView.setApePaterno(apePaterno);
		personaView.setApeMaterno(apeMaterno);
		personaView.setFechaNacimiento(fechaNacimiento);
		personaView.setCorreo(correo);
		personaView.setTelefono(telefono);
		
		Util.printJson(response, seguridadService.registrarPersona(personaView));
			
	}
	
	
	@RequestMapping(value=Mappings.MAPPING_IR_REUTILIZABLE_BUSCAR_PERSONA, method=RequestMethod.GET)
	public ModelAndView irBuscarPersona(HttpServletRequest request, HttpServletResponse response) {
		
		return new ModelAndView(VistasJsp.JSP_BUSCAR_PERSONAL_EXTERNO);
		
	}
	
	@RequestMapping(value=Mappings.MAPPING_IR_REUTILIZABLE_REGISTRAR_PERSONA, method=RequestMethod.GET)
	public ModelAndView irRegistrarPersona(HttpServletRequest request, HttpServletResponse response) {
		
		return new ModelAndView(VistasJsp.JSP_REGISTRAR_PERSONAL_EXTERNO);
		
	}
	
	
	
	
	@RequestMapping(value=Mappings.MAPPING_REUTILIZABLE_BUSCAR_PERSONA,method=RequestMethod.POST)
	public void buscarPersona(HttpServletRequest request, HttpServletResponse response){
		
		
		String codigo=request.getParameter("codigo").trim();
		String nombre=request.getParameter("nombre").trim();
		
		Util.printJson(response, seguridadService.buscarPersona(codigo, nombre));
	}
	
	@RequestMapping(value=Mappings.MAPPING_CARGAR_COMBOS,method=RequestMethod.GET)
	public void cargarCombos(HttpServletRequest request, HttpServletResponse response){
		
		String action=request.getParameter(ConstanteSYSAUT.CONSTANTE_COMBO_ACTION);
		logger.info(">>>>>>: "+action);
		List<SelectSysaut> lsCombo=new ArrayList<SelectSysaut>();
		
		SelectSysaut select;
		
		Map<String,Object> mapSelect = new HashMap<String, Object>();
		
		if (action.equals(ConstanteSYSAUT.CONSTANTE_COMBO_ACTION_CARGO)){
			List<Tcargo> lsTcargos=seguridadService.obtenerListaCargos();
			
			for (Tcargo tcargo:lsTcargos){
				select=new SelectSysaut();
				select.setValor(tcargo.getIdCargo());
				select.setNombre(tcargo.getNomCargo());
				lsCombo.add(select);
			}
		}
		else if (action.equals(ConstanteSYSAUT.CONSTANTE_COMBO_ACTION_PERFIL)){
			List<Tperfil> lsTperfils=seguridadService.obtenerListaPerfiles();
			
			for (Tperfil tperfil:lsTperfils){
				select=new SelectSysaut();
				select.setValor(tperfil.getIdPerfil());
				select.setNombre(tperfil.getNomPerfil());
				lsCombo.add(select);
			}
		}
		
		mapSelect.put(Constantes.JSON_ESTRUCTURA_ITEMS, lsCombo);
		mapSelect.put(Constantes.JSON_ESTRUCTURA_LABEL,Constantes.SELECTSYSAUT_LABEL);
		mapSelect.put(Constantes.JSON_ESTRUCTURA_IDENTIFIER,Constantes.SELECTSYSAUT_IDENTIFIER);
		
		String json=(new Gson()).toJson(mapSelect);
		Util.printJson(response, json);
	}
	
	/**************************************[REUTILIZABLES]***********************************************/
}
